package com.learn.springbootnetty.udpdemo;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * 单播发送。数据包中指定ip和端口
 */
public class ReceiveMessageDemo {
    public static void main(String[] args) throws Exception {
         /*
           按照下面的要求实现程序
               UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
               UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
         */

        // 1.创建接收端的DatagramSocket对象
        // 细节:
        //      在接收的时候,一定要手动绑定端口
        //      而且绑定的端口一定要跟发送的端口保持一致
        // 这个端口就表示你要从哪个端口上去接收数据
        DatagramSocket ds = new DatagramSocket(2002);

        // 2.数据包,存储接收到的数据
        // 创建字节数组,保存接收到的信息
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);

        while (true) {
            // 3.接收数据包
            ds.receive(dp);

            // 4.解析数据包
            // 调用getData()可以获取发送过来的数据
            byte[] data = dp.getData();
            // 调用getLength()获取当前接收到了多少字节
            int len = dp.getLength();
            // 获取发送端的电脑对象
            InetAddress address = dp.getAddress();
            // 获取发送端的IP,这个才是真正的IP
            String ip = dp.getAddress().getHostAddress();
            // 获取发送端的主机名
            String name = dp.getAddress().getHostName();
            // 获取发送端的端口号
            int port = dp.getPort();

            System.out.println("接收到数据:" + new String(data,0,len));
            System.out.println("该数据是从" + address + "这台电脑, " + "IP为:" + ip + ", 主机名为:" + name + "中的" + port + "这个端口发出的!");
        }
    }
}